﻿#!/usr/bin/python
# -*- coding utf-8 -*-
#-------------------------------------------------------------------------------
# Name:
# Purpose:
#
# Author:      ZWW
#
# Created:     03/05/2016
# Copyright:   (c) ZWW 2016
# Licence:     <your licence>
#-------------------------------------------------------------------------------
import numpy as np
import cv2
from matplotlib import pyplot as plt

def main():
    img = cv2.imread('small.png')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = np.float32(gray)

    dst = cv2.cornerHarris(gray, 2, 3, 0.04)
    dst = cv2.dilate(dst, None)
    img[dst>0.01*dst.max()]=[0,0,255]
    cv2.imshow('dst', img)
    if cv2.waitKey(0) & 0xff == 27:
        cv2.destroyAllWindows()

def goodFeature():
    img = cv2.imread('small.png')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)
    corners = np.int0(corners)

    for i in corners:
        x,y = i.ravel()
        cv2.circle(img, (x, y), 3, 255, -1)

    plt.imshow(img),plt.show()

def Meanshift():
    cap = cv2.VideoCapture('F:\\AV file\\Video\\1_CrowdRun_1080p50_RP1.h264')
    # take first frame of the video
    ret,frame = cap.read()
    # setup initial location of window
    #r,h,c,w = 250,90,400,125 # simply hardcoded the values
    r,h,c,w = 650,90,400,125 # simply hardcoded the values
    track_window = (c,r,w,h)
    # set up the ROI for tracking
    roi = frame[r:r+h, c:c+w]
    hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
    roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
    cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)
    # Setup the termination criteria, either 10 iteration or move by atleast 1 pt
    term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
    while(1):
        ret ,frame = cap.read()
        if ret == True:
            hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
            dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
            # apply meanshift to get the new location
            ret, track_window = cv2.meanShift(dst, track_window, term_crit)
            # Draw it on image
            x,y,w,h = track_window
            img2 = cv2.rectangle(frame, (x,y), (x+w,y+h), 255,2)
            cv2.imshow('img2',frame)
            k = cv2.waitKey(60) & 0xff
            if k == 27:
                break
            else:
                cv2.imwrite(chr(k)+"a.jpg",frame)
        else:
            break
    cv2.destroyAllWindows()
    cap.release()

def Camshift():
    cap = cv2.VideoCapture(0)
    # take first frame of the video
    ret,frame = cap.read()
    # setup initial location of window
    #r,h,c,w = 250,90,400,125 # simply hardcoded the values
    #track_window = (c,r,w,h)
    # set up the ROI for tracking
    #roi = frame[r:r+h, c:c+w]
    x,y,w,h = 400,150,125,90
    track_window = (x,y,w,h)
    roi = frame[y:y+h, x:x+w]
    hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
    roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
    cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)
    # Setup the termination criteria, either 10 iteration or move by atleast 1 pt
    term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
    while(1):
        ret ,frame = cap.read()
        if ret == True:
            hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
            dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
            # apply meanshift to get the new location
            ret, track_window = cv2.CamShift(dst, track_window, term_crit)
            # Draw it on image
            pts = cv2.cv.BoxPoints(ret)
            pts = np.int0(pts)
            img2 = cv2.polylines(frame,[pts],True, 255,2)
            cv2.imshow('img2',frame)
            k = cv2.waitKey(60) & 0xff
            if k == 27:
                break
            else:
                cv2.imwrite(chr(k)+"b.jpg",frame)
        else:
            break
    cv2.destroyAllWindows()
    cap.release()

if __name__ == '__main__':
    #main()
    #goodFeature()
    Meanshift()
    #Camshift()
